
package Model;

import com.mysql.jdbc.ResultSetMetaData;
import com.mysql.jdbc.Statement;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.table.AbstractTableModel;

public class ResultSetTableModel extends AbstractTableModel {


private int numfilas;
private Mysql mysql;
//String status = "";
Object [][] data ;




   public ResultSetTableModel(String consulta, Mysql mysql ) throws SQLException, ClassNotFoundException, IOException
 {
        this.mysql = mysql;
        setQuery( consulta ); // metodo de la clase madre AbstractTableModel
        
        
        
 }
   
public boolean isCellEditable (int row, int col){
   /* if (status.equalsIgnoreCase("normal"))
        return false;
    
    if (status.equalsIgnoreCase("change")){
        if (col==0)
           return false;
        else
           return true;
    }
    * 
    */
    return false;
}
 
 // tipo de columna
    @Override
 public Class getColumnClass( int column )
 {
 
// determina la clase de la columna 
 /*try {
 String className = mysql.metaData.getColumnClassName( column + 1  );

 // devuelve el tipo que es la columna
 return Class.forName( className );
 }


 catch ( Exception exception ) {
 exception.printStackTrace();
 
 }

 // si hay problemas o no la reconoce seria tipo object qee seria la imagen
 * 
 * 
 */
 return Object.class;
 
 }

 // metodo para saber el numero de columnas
    @Override
 public int getColumnCount()
 {
 // determine number of columns
 try {
 return mysql.metaData.getColumnCount();
 }
 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }

 // si no hay columnas regresara 0 columnas
 return 0;
 }

// metodo para el nombre de cada columna
    @Override
 public String getColumnName( int column )
 {
//determina el nombre OJO miremos qee estamos usando un objeto de la clase metaData
try {
 return mysql.metaData.getColumnName( column + 1 );
 }

 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }

//si no tiene nombre enviara "" es decir un string vacio
return "";
 }

//metodo para saber el numero de filas
    public int getRowCount()
 {
 return numfilas; // no va en un try and catch por qee no ocasionara un problema
 }

 // obtener el valor de la fila y columan
 public Object getValueAt( int row, int column )
 {

 return data[column][row];
 }

 // declara la consulta
 public void setQuery( String consulta )
 {
     mysql.st = null;
     mysql.resultSet = null;
     mysql.metaData = null;
     
        try {
            mysql.st = (Statement) mysql.connection.createStatement();
            //especifica la consulta y la ejecuta
            mysql.resultSet = (ResultSet) mysql.st.executeQuery( consulta );

            // obtiene los datos de resultSet
            mysql.metaData = (ResultSetMetaData) mysql.resultSet.getMetaData();

            // determina el final de filas
            mysql.resultSet.last(); // se mueve a la ultima fila
            numfilas = mysql.resultSet.getRow(); // la cantidad de filas

            // estructura de la tabla cambiada
            
               
            data = new Object [mysql.metaData.getColumnCount()][numfilas];
            mysql.resultSet.beforeFirst();

            
            int j=0;
            while(mysql.resultSet.next()){
                   for(int i=0;i<mysql.metaData.getColumnCount();i++){
                    
                    data[i][j]= mysql.resultSet.getObject(i+1);
                   }
              j++;
            }
     
        
        } catch (SQLException ex) {
            Logger.getLogger(ResultSetTableModel.class.getName()).log(Level.SEVERE, null, ex);
        }
 }


public void setValueAt(Object value, int row, int col){
      data[col][row]= value;
      fireTableCellUpdated(row,col);
      
      
    }
}
